package cn.tedu.v3;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 网络通讯---Socket【套接字】理解：互联网型java类
 *
 * 网络应用遵循的原则：
 * C/S架构 Client 客户端   Server   服务器   早期应用【手机app--手机应用】
 * JavaSE 桌面级软件--java并不擅长
 *
 * B/S加构 Browser浏览器端 Server 服务端后期应用【后台语言]
 * *JavaSE 做逻辑Mysql保存数据  Web---Java管理后台
 *
 * 客户端 类：Client----->网络通讯 Socket
 * 服务器端 类：Server----> 网络通讯 ServerSocket
 *
 * 网络通讯  ServerSocket、Socket--底层传输协议支持两种
 * TCP协议：可靠性号传输协议，基于字节流--传输低、安全性高【√传数据】
 * UDP协议：不可靠传输协议，基于数据报--传输高，安全低【游戏】
 * 以上两种协议，封装底层代码中
 *
 *
 * 需求：通过IP+端口    别人链接上自己    相互建议链接
 * 需求2：相互建议链接 ：开启服务端--客户端给服务端发送：文本
 *        提示：start()    写逻辑
 *   网络通讯 Socket，具备方法，支持标准流
 *     客户端|服务端-----Socket对象---调用方法
 *                                 getInputStream()获取输入流
 *                                 getOutputSream()获取输出流
 *
 */

/**
 * 聊天室Version2
 *
 * 功能：客户端--指定IP，端口号
 *      2.客户端给服务器发送文本
 *      3.客户端完成标准IO
 *      【新增】4.捕获异常，打印异常信息--异常全部抓住，用户明确提示
 *      5.关闭socket
 * 客户端
 */

/**
 * 聊天室 Version 2.1
 * 客户端基本不变：关闭socket、拓展增加IP
 *                          1.私有化IP
 *                          2.构造器，当前IP进行赋值
 *                          3.任意位置使用IP[读入知道对方IP]
 *
 */

/**
 * 多人聊天室 3
 * 功能：一个客户端与一个服务器端相互聊天
 * 1.客户端--连接服务器--第一件事：写出
 * 2.客户端--读入--存线程中，对应服务器的读入
 */
public class Client {
    private Socket socket;
    //1.私有化IP
    private String ip;
    public Client() {
        try {
            socket = new Socket("172.20.10.12", 1019);
            //2.确定传入IP就是当前IP地址
            ip=socket.getInetAddress().getHostAddress();
        } catch (UnknownHostException e) {
            System.out.println("IP地址有问题，请询问服务器端！");
        } catch (IOException e) {
            System.out.println("客户端主动退出了：断开连接");
        }
    }
    //1.start方法：IO流操作：写出功能，实现读入功能交给线程处理
    public void start() {
        PrintWriter pw = null;
        //1.6置空流-赋值、关闭
        // BufferedReader br=null;
        try {
            //1.2读入操作
            BufferedReader  br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF8"));
            //1.1写出操作
            pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF8"));
            //1.3创建线程--Lambda--读入功能-存线程中
           new Thread(()->{
                //1.4线程中--创建变量--接收服务器端发来的文本
                String message;
                try {
                    while ((message=br.readLine())!=null){
                        System.out.println("服务器端说："+message);
                    }
                } catch (IOException e) {
                    System.out.println("服务器端发来的消息断开了~");
                }
            }).start();
            //1.5.1 控制台卡住--输入内容
            Scanner input=new Scanner(System.in);
            //1.5.2一直写出
            while (true){
                System.out.println("客户端请输入:");
                String sme=input.nextLine();
                pw.println("客户端说："+sme);
            }
        } catch (UnsupportedEncodingException e) {
            System.out.println("客户端与服务器端：字符集不一致！");
        } catch (IOException e) {
            System.out.println("客户端断开了链接");
        } finally {
            if (pw != null)
                pw.close();
           if(socket!=null&&socket.isClosed()){
               System.out.println("客户端关闭成功");
               try {
                   socket.close();
               } catch (IOException e) {
                   System.out.println("客户端关闭失败");
               }
           }
        }
    }
    //读入
    //  while (true){
//String str=br.readLine();
    //  System.out.println("服务器说话"+str);
    //  }

    //4.创建主方法---Client类运行
    public static void main(String[] args) {
        //5.创建客户端类--默认构造器--调用实例化 Socket:IP,端口
        Client client = new Client();
        //6.调用开始方法---传输数据：IO
        client.start();
    }
}


